unit UsuarioDM;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, DB, FileUtil, LResources, Forms, Controls, Graphics,
  ZDataset, ZSqlUpdate, MainDM, QueryConditions;

type

  { TUsuarioData }

  TUsuarioData = class(TMainDataModule)
    UsuarioDataSource: TDatasource;
    UsuarioZQuery: TZQuery;
    UsuarioZQuerylogin_usuario: TStringField;
    UsuarioZQuerynome_usuario: TStringField;
    UsuarioZQuerysenha: TStringField;
    UsuarioZQuerytipo: TStringField;
    UsuarioZUpdate: TZUpdateSQL;
    AuxiliarZQuery: TZQuery;
    procedure DataModuleCreate(Sender: TObject);
    /// Abre o DataSet
    procedure OpenDataSet(); override;
    /// Fecha o DataSet
    procedure CloseDataSet(); override;
    /// Realiza busca
    /// @param(Condicoes são as condições para a busca)
    /// @param(Tabela é a tabela no banco de dados)
    procedure Search(Condicoes: TQueryConditions; Tabela: string); override;
    /// Verifica se um login é válido
    /// @param(Usuario é o login do usuário)
    /// @param(Senha é a senha do usuário)
    /// @return(Retorna um caracter com o tipo de usuário ou #0 se o usuário e senha não conferem'
    function Login(Usuario, Senha: string): char;
    /// Alteração de senha
    procedure AlteraSenha();
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  UsuarioData: TUsuarioData;

implementation

uses ConnectionDM, Dialogs, md5;

{ TUsuarioData }

procedure TUsuarioData.DataModuleCreate(Sender: TObject);
begin
  MainDataSet := UsuarioZQuery;
end;

procedure TUsuarioData.OpenDataSet;
begin
  //!ConnectionData.EmptyQuery(UsuarioZQuery, 'usuario');
  UsuarioZQuery.Open();
end;

procedure TUsuarioData.CloseDataSet;
begin
  UsuarioZQuery.Close();
end;

procedure TUsuarioData.Search(Condicoes: TQueryConditions; Tabela: string);
begin
  ConnectionData.OpenQueryConditions(UsuarioZQuery, Tabela, Condicoes);
end;

function TUsuarioData.Login(Usuario, Senha: string): char;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('SELECT tipo FROM usuario');
    SQL.Add('WHERE login_usuario = :usuario');
    SQL.Add('AND senha = :senha');
    Senha := MD5Print(MD5String(Senha));
    ParamByName('senha').AsString := senha;
    ParamByName('usuario').AsString := usuario;
    Open();
    if (RecordCount > 0) then begin
      Result := FieldByName('tipo').AsString[1];
    end else begin
      Result := #0;
    end;
  end;
end;

procedure TUsuarioData.AlteraSenha;
var
  Senha, SenhaConfirma: string;
begin
  // Verifica se DataSet tem usuário para alteração de senha
  if (UsuarioZQuery.Active) and (UsuarioZQuery.RecordCount > 0) then begin
    Senha := '';
    if (InputQuery('Alteração de senha', 'Informe a senha.', True, Senha)) then begin
      if (Senha = '') then begin
        ShowMessage('Senha inválida!');
      end else begin
        SenhaConfirma := '';
        if (InputQuery('Confirmação de senha', 'Informe novamente a senha.',
          True, SenhaConfirma)) then begin
          if (Senha = SenhaConfirma) then begin
            Senha := MD5Print(MD5String(Senha));
            UsuarioZQuery.Edit();
            UsuarioZQuery.FieldByName('senha').AsString := senha;
            UsuarioZQuery.Post();
            ShowMessage('Senha alterada com sucesso!');
          end else begin
            ShowMessage('A confirmação de senha não confere!');
          end;
        end;
      end;
    end;
  end;
end;

initialization
  {$I usuariodm.lrs}

end.
